package dao;

import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.commons.dbcp2.BasicDataSourceFactory;


public class DBUtils {
	//获取数据库连接的基本信息
	private static String driverName;
	private static String url;
	private static String user;
	private static String password;
	//使用DBCP连接池时的配置文件
	private static Properties dbcpProp;
	//数据源对象
	private static DataSource dataSource;
	static{
		try {
			//从db.properties文件中读取连接数据库的所有信息，db.properties文件保存在 src的根目录
			InputStream inStream = DBUtils.class.getClassLoader().getResourceAsStream("db.properties");
			Properties prop = new Properties();
			prop.load(inStream);
			driverName = prop.getProperty("driver");
			url = prop.getProperty("url");
			user = prop.getProperty("user");
			password = prop.getProperty("pwd");
			Class.forName(driverName);
			
			//从dbcpconfig.properties文件中读取配置dbcp连接池的配置信息，dbcpconfig.properties文件保存在 src的根目录
			dbcpProp = new Properties();
			dbcpProp.load(DBUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties"));
			dataSource = BasicDataSourceFactory.createDataSource(dbcpProp);
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			
		}
	}
	/**
	 * 最基本的获取数据库连接对象Connection对象的方法
	 * @return Connection对象
	 */
	public static Connection getConnection(){
		try {
			return DriverManager.getConnection(url, user, password);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 基于Tomcat连接池获取数据库连接Connection对象的方法，配置Tomcat连接池的配置文件见META-INF/目录下的context.xml文件
	 * @return Connection对象
	 */
	public static Connection getConnectionFromConnectionPool() {
		try {
			Context initContext = new InitialContext();
			DataSource connectionPool = (DataSource) initContext.lookup("java:/comp/env/jdbc/jspexam");
			return connectionPool.getConnection();
		} catch (NamingException | SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
		
	}
	/**
	 * 基于dbcp连接池获取数据库连接对象Connection对象的方法，数据源dataSource对象的创建参考static代码块中的代码
	 * @return Connection对象
	 */
	public static Connection getConnectionUseDBCP(){
		try {
			return dataSource.getConnection();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return null;
		}
	}
	/**
	 * 基本的关闭Connection、Statement和ResultSet对象的方法，若使用DBCP连接池时是无需自行关闭相关对象。
	 * @param connection 数据连接对象
	 * @param stmt Statement对象
	 * @param rs ResultSet对象
	 */
	public static void close(Connection connection,Statement stmt,ResultSet rs){
		if (rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 基本的关闭Connection、Statement对象的方法，若使用DBCP连接池时是无需自行关闭相关对象。
	 * @param connection 数据库连接对象
	 * @param stmt Statement对象
	 */
	public static void close(Connection connection,Statement stmt){
		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		if (connection != null) {
			try {
				connection.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 基本的关闭ResultSet对象的方法。
	 * @param rs 结果集对象
	 */
	public static void close(ResultSet rs){
		if (rs!=null) {
			try {
				rs.close();
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	/**
	 * 获取数据源DataSource对象，这是基于DBCP来获取DataSource对象，方便后续的方法使用
	 * @return DataSource 对象
	 */
	public static DataSource getDataSource(){
		return dataSource;
	}
		
				
}
